package com.bdqn.interceptor;

import com.bdqn.util.TokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class Tokenlnterceptor implements HandlerInterceptor {
    @Autowired
    TokenUtil tokenUtil;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("------------1---------------");
        response.setContentType("text/html;charset=UTF-8");
        /**
         *跨域是指在浏览器中，一个网页试图请求另一个域（协议、域名或端口不同）的资源时，所涉及的安全机制。
         * 在Web开发中，一般来说，由于安全性原因，浏览器会阻止一个域访问另一个域的数据，这种限制称为同源策略（Same-Origin Policy）。
         * 进行跨域请求时，浏览器会先发送一个OPTIONS请求，以确认目标服务器允许特定的请求方法和头。
         * 关键来了，这个自动发送的options请求，是不会带有我们的token的。
         * 而路径却是跟我们实际请求一致，因此同样会被拦截器拦截。所以即便我们设置了cros的config，
         * options也会因为没有token而被拒绝，而实际带有token的请求却因为options被拒绝而没有发送。
         */
        if(request.getMethod().equals("OPTIONS")){
            response.setStatus(HttpServletResponse.SC_OK);
            return true;
        }
        //token身份验证，验证通过放行
        //1.获取请求头中携带的token字符串
        String token = request.getHeader("Token");
        //2.验证是否合理
        if (token!=null){
            //验证token有效
            if (tokenUtil.validateToken(token)){
                return true;
            }else {
                //响应错误状态码，信息
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().print("token无效...");
                return false;
            }
        }
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().print("请携带token");
        return false;
    }
}
